#include "configuredelement.h"

ConfiguredElement::ConfiguredElement(){ }

void ConfiguredElement::init(const QString &configPath)
{
    QFile file(configPath);
    if (file.open(QIODevice::ReadOnly))
    {
        try
        {
            load(file);
        }
        catch(QXmlParseException& e)
        {
            throw LoadResourceException(configPath);
        }
        file.close();
    }
    else throw LoadResourceException(configPath);

    config = configPath;
}

ConfiguredElement::~ConfiguredElement(){ }

//# Методы работы с конфигами

void ConfiguredElement::load(QFile &file)
{
    QDomDocument domDoc;
    domDoc.setContent(&file);
    QDomNode root = domDoc.namedItem("root");
    //разбираем конфигурацию
    QDomNode item = root.namedItem("item");
    this->name = item.attributes().namedItem("name").nodeValue();
    this->description = item.attributes().namedItem("description").nodeValue();

    //ветвь изображения
    QDomNode tagImage = item.namedItem("image");
    this->image->load(tagImage.firstChild());

    //ветвь дополнительно
    QDomNode etc = item.namedItem("etc");
    initProps(etc);

    //ветвь контактов
    QDomNode pins = item.namedItem("pins");
    int count = pins.childNodes().count();
    for (int i = 0; i < count; i++)
    {
        if (pins.childNodes().at(i).isElement() &&
            (pins.childNodes().at(i).nodeName() == "pin"))
        {
            QDomNamedNodeMap pnode = pins.childNodes().at(i).attributes();
            //Новый пин
            Pin* p = new Pin(this);
            p->name = pnode.namedItem("name").nodeValue();
            p->index = pnode.namedItem("index").nodeValue().toInt();
            p->type = (PinType)pnode.namedItem("type").nodeValue().toInt();

            p->activeRegion.topLeftPoint.setX(pnode.namedItem("x").nodeValue().toInt());
            p->activeRegion.topLeftPoint.setY(pnode.namedItem("y").nodeValue().toInt());

            p->activeRegion.bindPoint.setX(pnode.namedItem("bindx").nodeValue().toInt());
            p->activeRegion.bindPoint.setY(pnode.namedItem("bindy").nodeValue().toInt());

            p->activeRegion.width = pnode.namedItem("width").nodeValue().toInt();
            p->activeRegion.height = pnode.namedItem("height").nodeValue().toInt();

            this->pins.append(p);
        }
    }
}

void ConfiguredElement::save(QFile &file)
{
    QDomDocument domDoc;
    //Собрать XML документ
#warning Save element
    //Сохранить
    QTextStream outstr(&file);
    domDoc.save(outstr,0);
}

void ConfiguredElement::saveConfiguration(QString &filename)
{
    QFile file(filename);
    if (file.open(QIODevice::WriteOnly))
    {
        save(file);
        file.close();
    }
}

void ConfiguredElement::initProps(const QDomNode &additionals){}

void ConfiguredElement::saveProps(QDomNode &additionals){}

QString ConfiguredElement::getConfig()
{
    return config;
}
